home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / haeberli / libcan / cantext.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-02  |  2.8 KB  |  115 lines

  1. /*
  2.  * Copyright 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. /*
  18.  *    cantext -
  19.  *        Draw points, lines, rectangles and texture maps onto a 
  20.  *    canvas.
  21.  *
  22.  *                Paul Haeberli - 1991
  23.  *
  24.  *    exports
  25.  *
  26.     void drawtext(c,fnt,mat,xpos,ypos,string)
  27.  *
  28.  */
  29. #include "stdio.h"
  30. #include "math.h"
  31. #include "canvas.h"
  32. #include "objfnt.h"
  33. #include "polyscan.h"
  34.  
  35. static void transpoint(mat2d *mat,double ix,double iy,double *ox,double *oy)
  36. {
  37.     *ox = mat->a*ix+mat->b*iy+mat->tx;
  38.     *oy = mat->c*ix+mat->d*iy+mat->ty;
  39. }
  40.  
  41. static void printmat2(mat2d *mat)
  42. {
  43.     fprintf(stderr,"a %f\n",mat->a); 
  44.     fprintf(stderr,"b %f\n",mat->b); 
  45.     fprintf(stderr,"c %f\n",mat->c);
  46.     fprintf(stderr,"d %f\n",mat->d); 
  47.     fprintf(stderr,"tx ty %f %f\n",mat->tx,mat->ty); 
  48. }
  49.  
  50. static void candrawchar(sptr,mat,cxpos,cypos)
  51. short *sptr;
  52. mat2d *mat;
  53. float cxpos, cypos;
  54. {
  55.     int nverts;
  56.     double tx, ty;
  57.  
  58.     while(1) {
  59.         switch(*sptr++) {
  60.             case PO_BGNLOOP:
  61.         cannextfacet();
  62.                 break;
  63.             case PO_ENDBGNLOOP:
  64.         cannextfacet();
  65.                 break;
  66.             case PO_RETENDLOOP:
  67.         cannextfacet();
  68.                 return;
  69.                 break;
  70.             case PO_RET:
  71.                 return;
  72.                 break;
  73.         }
  74.         nverts = *sptr++;
  75.         while(nverts--) {
  76.             transpoint(mat,(double)sptr[0],(double)sptr[1],&tx,&ty);
  77.         canvertex(cxpos+tx,cypos+ty);
  78.             sptr+=2;
  79.         }
  80.     }
  81. }
  82.  
  83. void drawtext(c,fnt,mat,xpos,ypos,text,supersample)
  84. canvas *c;
  85. objfnt *fnt;
  86. mat2d *mat;
  87. float *xpos, *ypos;
  88. char *text;
  89. {
  90.     chardesc *cd;
  91.     int ixpos, iypos;
  92.     double dx, dy, cxpos, cypos;
  93.  
  94.     ixpos = 0;
  95.     iypos = 0;
  96.     dx = 0.0;
  97.     dy = 0.0;
  98.     while(*text) {
  99.     cd = getchardesc(fnt,*text);
  100.         if(cd && cd->data) {
  101.         cxpos = *xpos+dx;
  102.         cypos = *ypos+dy;
  103.         canbeginscan(c,supersample);
  104.             candrawchar(cd->data,mat,cxpos,cypos);
  105.         canendscan();
  106.             ixpos += cd->movex;
  107.             iypos += cd->movey;
  108.             transpoint(mat,(double)ixpos,(double)iypos,&dx,&dy);
  109.         }
  110.         text++;
  111.     }
  112.     *xpos = *xpos+dx;
  113.     *ypos = *ypos+dy;
  114. }
  115.